package visiopuce.service.document;

import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Display;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Alteration;
import visiopuce.objets.Analyse;
import visiopuce.objets.Bande;
import visiopuce.objets.CNVFISH;
import visiopuce.objets.CNVRecap;
import visiopuce.objets.Champ;
import visiopuce.objets.Personne;
import visiopuce.objets.Phenotype;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Puce;
import visiopuce.objets.RenduPuce;
import visiopuce.objets.Resultat;
import visiopuce.objets.Utilisateur;
import visiopuce.objets.VerifBiomol;
import visiopuce.objets.VerifFish;
import visiopuce.service.AlterationServiceImpl;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.PuceServiceImpl;
import visiopuce.service.ReferentielServiceImpl;
import visiopuce.service.ResultatServiceImpl;
import visiopuce.ui.CompteRenduDialog;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

public class DemandeFishDoc {

	public String createDocument(Puce puce) {
		String nomFichierout = "";
		try {

			InputStream in = new FileInputStream(new File(ApplicationContexte.REPERTOIRE_MODEL + "demandeFISH.docx"));
			IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);

			Analyse analyse = AnalyseServiceImpl.getInstance().getAnalyseByIdAnalyse(puce.getAnalyse().getIdAnalyse());
			Prelevement prelevement = PrelevementServiceImpl.getInstance().getPrelevementById(analyse.getPrelevement().getIdPrelevement());
			Personne personne = PersonneServiceImpl.getInstance().getPersonneById(prelevement.getPersonne().getIdPersonne());
			SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");

			IContext context = report.createContext();
			context.put("personne", personne);

			context.put("prelevement", prelevement);
			context.put("puce", puce);

			List<CNVFISH> cnvFISHs = new ArrayList<CNVFISH>();

			List<Alteration> alterations = AlterationServiceImpl.getInstance().getAlterationAVerif(puce.getIdPuce());
			for (Alteration alteration : alterations) {
				if (alteration.isaVerifFish()) {
					CNVFISH cnvf = new CNVFISH();
					if (alteration.getNbCopie() > 2) {
						cnvf.setDeldup("Duplication");
					} else {
						cnvf.setDeldup("Délétion");
					}
					if (alteration.getPrecisionVerif() != null) {
						if (alteration.getPrecisionVerif().contains("RP")) {
							cnvf.setGenes("-");
							cnvf.setSondes(alteration.getPrecisionVerif());
						} else {
							cnvf.setGenes(alteration.getPrecisionVerif());
							cnvf.setSondes("-");
						}
					} else {
						cnvf.setGenes("-");
						cnvf.setSondes("-");
					}
					cnvf.setTaille(((alteration.getFinHg19() - alteration.getDebutHg19()) / 1000) + "kb");
					List<Bande> lbandes = ReferentielServiceImpl.getInstance().getBandesByCNV(alteration);
					String bandes = "";
					if (lbandes != null) {
						for (Bande bande : lbandes) {
							bandes += bande.getLibelle() + "-";
						}
					}
					if (bandes.length() > 2) {
						bandes = bandes.substring(0, bandes.length() - 1);
					}
					cnvf.setRegion(alteration.getChromosome()+bandes);
					cnvFISHs.add(cnvf);
				}
			}

			context.put("cnvFISHs", cnvFISHs);

			String numCulot = "";
			List<Prelevement> prelevts = PrelevementServiceImpl.getInstance().findAllByidPersonne(personne.getIdPersonne());
			for (Prelevement prelevement2 : prelevts) {
				if (prelevement2.getSecteur().getIdSecteur() == 1 || prelevement2.getSecteur().getIdSecteur() == 2 || prelevement2.getSecteur().getIdSecteur() == 4) {
					numCulot += prelevement2.getNumeroPrelevement() + " ";
				}
			}
			if (numCulot.isEmpty()) {
				numCulot = "Pas de culot";
			}
			context.put("culot", numCulot);
			
			Date d = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			context.put("date", sdf.format(d));

			boolean creer3 = true;
			File fileout3 = new File(ApplicationContexte.REPERTOIRE_FISH + prelevement.getNumeroPrelevement() + "_" + personne.getNom() + "_" + personne.getPrenom() + "_demandeFISH_" + formatter.format(new Date()) + ".docx");
			if (fileout3.exists()) {
				creer3 = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Fichier existant", "Le fichier " + fileout3.getName() + " existe déjà souhaitez vous l'écraser?");
			}
			if (creer3) {
				fileout3.setWritable(true);
				OutputStream out3 = new FileOutputStream(fileout3);
				report.process(context, out3);
				if (fileout3.exists()) {
					nomFichierout += fileout3.getName();
				}
				out3.close();
			}

			in.close();

			Desktop desktop = Desktop.getDesktop();
			desktop.open(fileout3);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XDocReportException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return nomFichierout;
	}
}
